package com.xjx.common.util;

import lombok.extern.slf4j.Slf4j;
import java.util.*;

@Slf4j
public class RangeShardingUtil {
    
    /**
     * 分片范围配置
     */
    private static final Map<String, RangeConfig> RANGE_CONFIGS = new HashMap<>();
    
    /**
     * 范围配置类
     */
    public static class RangeConfig {
        private final long start;
        private final long end;
        private final String node;
        
        public RangeConfig(long start, long end, String node) {
            this.start = start;
            this.end = end;
            this.node = node;
        }
        
        public boolean contains(long value) {
            return value >= start && value < end;
        }
        
        public long getStart() { return start; }
        public long getEnd() { return end; }
        public String getNode() { return node; }
    }
    
    /**
     * 初始化范围分片配置
     * @param tableName 表名
     * @param ranges 范围配置列表
     */
    public static void initRangeConfig(String tableName, List<RangeConfig> ranges) {
        RANGE_CONFIGS.put(tableName, new RangeConfig(0, Long.MAX_VALUE, "default"));
        log.info("初始化表 {} 的范围分片配置，范围数量: {}", tableName, ranges.size());
    }
    
    /**
     * 根据分片键获取节点
     * @param tableName 表名
     * @param shardingKey 分片键
     * @return 节点名称
     */
    public static String getNode(String tableName, Long shardingKey) {
        RangeConfig config = RANGE_CONFIGS.get(tableName);
        if (config == null) {
            throw new RuntimeException("表 " + tableName + " 未配置范围分片");
        }
        
        // 这里可以根据实际需求实现范围查找逻辑
        // 简化版本，实际应该根据shardingKey找到对应的范围
        return config.getNode();
    }
    
    /**
     * 添加新的范围配置（扩容时使用）
     * @param tableName 表名
     * @param start 起始值
     * @param end 结束值
     * @param node 节点名称
     */
    public static void addRange(String tableName, long start, long end, String node) {
        log.info("为表 {} 添加新范围: [{}, {}) -> {}", tableName, start, end, node);
        // 实际实现中需要更新配置并重新排序
    }
    
    /**
     * 获取表的所有范围配置
     * @param tableName 表名
     * @return 范围配置列表
     */
    public static List<RangeConfig> getRanges(String tableName) {
        // 实际实现中返回该表的所有范围配置
        return new ArrayList<>();
    }
}

